TSKaigi 2025
https://gyazo.com/cc5aebc58a75f3322041606279bb7cd9
https://2025.tskaigi.org/
高度な型付け、どう教える? | TSKaigi 2025
https://speakerdeck.com/progfay/gao-du-naxing-fu-ke-doujiao-eru
progfay
そもそも高度な型を教える必要はある?
型の恩恵を得るため
誰でも読み書きできるものではない
読めないコードは負債になる
属人性が高い
諦めるか、メンバーが読めるようになるか
課題
書き手が処理のイメージがしづらい
デバッグしづらい
TypeScriptの挙動に癖がある
提案
JavaScriptで下書きでTypeScriptで翻訳する
慣れ親しんだ言語で処理を把握
型レベルプログラミングで置き換える
下書きの恩恵
慣れ親しんだ言語なので心理的ハードルが下げられる
処理や思考の整理ができる
デバッグが可能になる
翻訳の注意点
JSとTSは等価ではなく完全に対応するわけではない
Optional Propertyやreadonly、Unionは表現できない
ヘルパーを作ってあげる
TypeScript特有の癖はそのまま
体当たりで学 or 仕様を学ぶ必要がある
Deep Readonly
https://github.com/type-challenges/type-challenges/blob/main/questions/00009-medium-deep-readonly/README.ja.md
高度な型定義に慣れていない人向けに20分程度で作れるようになった
万能な手法ではない
良いところ
慣れ親しんだ言語で学べる
デバッグしやすい
修正を下書きの時点で学べる
悪いところ
ヘルパー関数つくるのが大変
AIに下準備をしてもらう
JS→TSの翻訳が自明ではない
TypeScript特有の癖が残る
TypeScriptとReactで、WAI-ARIAの属性を正しく利用する | TSKaigi 2025
TypeScriptとReactで、WAI-ARIAの属性を正しく利用する - Google Slides
ymrl
TypeScriptネイティブ移植観察レポート TSKaigi 2025 | TSKaigi 2025
berlysia
A 10x Faster TypeScript - TypeScript
Microsoft BuildでのTypeScript Nativeプレビュー
コードネーム
Strada(既存のTypeScript実装)
Corsa(Go言語による実装)
なぜネイティブで実装するのか
パフォーマンスとスケーラビリティ
計算負荷の高い用途に最適じゃない
コンパイラの用途としては限界
VMは性能がとても高い
最適化をやりつくしている
JavaScriptの限界を超えるためにGo移植
なぜ移植が選ばれたのか
TypeScriptのあらゆる挙動がどこかで利用されたもの
Hyrumの法則
型チェッカーにとって後方互換性は絶対
フラグで従来のコードがコンパイルできるようにする
プラグアンドプレイで置き換えられるものを目指す
なぜGo言語なのか
関数+データ構造での手続き型の実装スタイルとの親和性
checker.tsがその状態なので…
ガベージコレクションをもって循環参照を自然に扱える
共有メモリを用いた並列処理が自然
クロスプラットフォームにネイティブコードで動作
10x Fasterの内訳
ネイティブ化
JITとdeopt
型やASTのデータ構造のインライン化、メモリの効率的な利用
オブジェクトごとにヒープに割り当てられてGCが頻発…
Corsaはまとめてメモリを確保、GCコストも激減(これだけ倍速になる)
文字列管理が効率的なGoの言語特性
JSはUTF-16、GoはUTF-8
コード前提だけの用途ならほぼ半分で済む
並列処理
ファイルごとに独立処理可能な部分を積極的に並列化
Goroutine
型チェッカーはプロジェクトを4分割で並列処理
なぜ4つなのか
型チェック結果を決定的にするために4分割で固定
将来的には
互換性
目標は99.99%の互換性
10万件のエラー差分検知テストが存在
新たにUnion型や型自体の決定的順序付けの導入
並列化で型の結果・順番が変わるので順序を与えて決定的にする
開発スピード
TypeScriptの開発に関わっている人が移植に関わっている
移植を支援するGoへの構文変換ツールが存在する
自動変換→人の手を介して修正→テストで検証
AIベースの一括変換は使われていない
補助的なものは利用されている
得たパフォーマンスバジェットの使い道
型の決定的な順序付け
重い機能や改善に導入
出来た余裕を使い切らないように注意する
AIと連携するリアルタイム体験
複雑すぎる型を書いて性能の余裕を使いつぶさないようにしてほしい
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない | TSKaigi 2025
フロントエンドエンジニアの強み
HTML、JS、CSS
アクセシビリティ
UI/UX
バックエンドエンジニアの強み
インフラ
DB
サーバー構築
CI/CD
バックエンドエンジニアはなぜ必要か
セキュリティの担保
非同期処理・ジョブ実行
ビジネスロジックの隠ぺい
外部システム連携
BaaS, IDaaSはメリット・デメリットの検討は必須
アプリケーションによって運用体制や正解が異なる
フロントエンドとバックエンドは分離すべき?
基本的にはそう
バックエンドファーストなのは密結合してしまう
理由
Information Leakage
モジュールが自分の責任範囲を超えて他のモジュールの知識や制約に依存してしまっている
あとから分けるの無理
運営しながらやることは無理だと考える
アーキテクチャの柔軟性
ビルドプロセスの分割もできる
バージョンアップや脆弱性対応も分割できる
バックエンド言語はなんでもいい
要点は責任分離
PHPをおすすめする100の理由
どこでも65点とれる言語
ハンマーのような単純な道具
シェアードナッシング
メモリを読みあうような不具合は起きない
セグフォが起きない
不具合の検証がしやすい
モダン化の流れ
交差型、Union型、false型
Immutable classes, properties
Attribute
Composer
パッケージマネージャ
PHPUnit
テストランナー
PHPStan
静的検査
CI/CD
PHP-CS-Fixer
Prettier
開発状況
The PHP Foundation
年1回のアップデート
日本人のコアメンテナも増えてきた
php.internals
RFCによる機能変更議論
PHPコミュニティ
複雑なフォームを継続的に開発していくための技術選定・設計・実装 | TSKaigi 2025
https://speakerdeck.com/izumin5210/number-tskaigi2025
izumin
useStateのみだと1フィールド更新するために全体再描画が起こる
React Hook Formなどのライブラリは基本的な面倒ごとは吸収してくれる
本当にこれだけで大丈夫?
UIにバリデーション記述が埋もれる問題
テストがしづらい
バリデーションも重要なロジック
バリデーションスキーマで分離する
構造と制約を宣言的に記述
フォームのモデリングを促す
フォームはプログラミングとして難しくなりやすい
入力があって、状態が構築され、同期・非同期操作があって、出力が…
表面的な難しさとプロダクトが持つ本質的な複雑さ
限界
React Hook Form + ZodはwatchやsetValueが増えたらアラート
危険なサイン
useEffectとsetStateを使いだす
Zodは制約と形状しか提供できないので合成した値の掲示とかは向いていない
TS特化Clineプログラミング | TSKaigi 2025
mizchi
うまくいくプロンプト
自立的に修復できるようなプロンプト
コメントで自己仕様を記述させる
うまくいかないプロンプト、その理由
現状認識
結論
書きすぎない
3000行も書くと破綻する
執拗に出力を例示
ゼロショットは無理
両立条件の矛盾を避ける
矛盾すると性能が下がる
段階的に厳して行く